﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using Model;
using System.Configuration;


namespace DAO
{
    public class ClienteDAO
    {
        private SqlConnection connection = null;
        private static String sqlConn = ConfigurationManager.ConnectionStrings["ControlePedidoDB"].ToString();
        private static ClienteDAO clienteDAO = null;

        private ClienteDAO(){
            connection = new SqlConnection(sqlConn);
        }

        public static ClienteDAO getInstance()
        {
            if (clienteDAO == null)
            {
                clienteDAO = new ClienteDAO();
            }

            return clienteDAO;
        }

        public bool inserir(Cliente cliente)
        {
            bool validacao = false;
            String SQL_INSERT = "INSERT INTO Cliente " +
                                 "(nome, cpf_cnpj, endereco, " +
                                 "bairro, cidade, uf, " +
                                 "tel1, tel2, tel3) VALUES " +
                                 " ('" + cliente.Nome +
                                 "', '" + cliente.CpfCnpj +
                                 "', '" + cliente.Endereco +
                                 "', '" + cliente.Bairro +
                                 "', '" + cliente.Cidade +
                                 "', '" + cliente.Uf +
                                 "', '" + cliente.Tel1 +
                                 "', '" + cliente.Tel2 +
                                 "', '" + cliente.Tel3 + "')";
            SqlCommand command = null;

            try
            {
                //Abre a conexao com o BD
                connection.Open();

                //Cria comando SQL
                command = new SqlCommand(SQL_INSERT, connection);

                //Executa a query SQL
                command.ExecuteNonQuery();

                validacao = true;

            }
            catch (SqlException)
            {
                throw new Exception("Problemas ao inserir produto");
            }
            finally
            {
                connection.Close();
            }

            return validacao;
        }

        public bool alterar(Cliente cliente)
        {
            bool validacao = false;


            String SQL_UPDATE = "UPDATE cliente SET" +
                                 " nome='" + cliente.Nome +
                                 "', cpf_cnpj='" + cliente.CpfCnpj +
                                 "', endereco='" + cliente.Endereco +
                                 "', bairro='" + cliente.Bairro +
                                 "', cidade='" + cliente.Cidade +
                                 "', uf='" + cliente.Uf +
                                 "', tel1='" + cliente.Tel1 +
                                 "', tel2='" + cliente.Tel2 +
                                 "', tel3='" + cliente.Tel3 +
                                 "' WHERE id_cliente='" + cliente.Codigo + "'";
            SqlCommand command = null;

            try
            {

                connection.Open();

                command = new SqlCommand(SQL_UPDATE, connection);

                command.ExecuteNonQuery();

                validacao = true;

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                connection.Close();
            }

            return validacao;
        }

        public bool cancelar(Cliente cliente)
        {
            bool validacao = false;
            String SQL_CANCEL = "DELETE FROM Cliente WHERE id_cliente=" + cliente.Codigo;

            SqlCommand command = null;

            try
            {
                connection.Open();

                command = new SqlCommand(SQL_CANCEL, connection);

                command.ExecuteNonQuery();

                validacao = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                connection.Close();
            }

            return validacao;

        }

        public Cliente consultar(Cliente clienteEntrada)
        {
            Cliente cliente = null;
            String SQL_CONSULTA = "SELECT * FROM Cliente " +
                                  "WHERE id_cliente = " + clienteEntrada.Codigo;
            SqlCommand commandPopula = null;
            SqlDataReader Reader = null;

            try
            {
                connection.Open();

                commandPopula = connection.CreateCommand();

                commandPopula.CommandText = SQL_CONSULTA;

                Reader = commandPopula.ExecuteReader();

                StringBuilder consulta = new StringBuilder();
                String[] resultadoBusca = null;

                while (Reader.Read())
                {
                    for (int i = 0; i < Reader.FieldCount; i++)
                    {
                        consulta.Append(Reader.GetValue(i).ToString() + '/');
                    }

                }

                resultadoBusca = consulta.ToString().Split('/');

                cliente = new Cliente();


                cliente.Codigo = clienteEntrada.Codigo;
                cliente.Nome = resultadoBusca[1];
                cliente.CpfCnpj = resultadoBusca[2];
                cliente.Endereco = resultadoBusca[3];
                cliente.Bairro = resultadoBusca[4];
                cliente.Cidade = resultadoBusca[5];
                cliente.Uf = resultadoBusca[6];
                cliente.Tel1 = resultadoBusca[7];
                cliente.Tel2 = resultadoBusca[8];
                cliente.Tel3 = resultadoBusca[9];

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                connection.Close();
                Reader.Close();
            }

            return cliente;
        }

        public List<Cliente> recuperarClientes(Cliente cliente)
        {
            List<SqlParameter> parametros = new List<SqlParameter>();
            List<Cliente> clientesRecuperados = new List<Cliente>();
            Cliente auxiliar = null;
            String SQL_BUSCA = "SELECT id_cliente, nome, cpf_cnpj FROM cliente WHERE ";
            SqlCommand comandoExecutar = null;
            SqlDataReader resultadoBusca = null;

            if (cliente.Codigo > 0)
            {
                SQL_BUSCA += "id_cliente = @id";

                parametros.Add(new SqlParameter("@id", cliente.Codigo));
            }

            if (cliente.Nome != null && !cliente.Nome.Equals(""))
            {

                if (SQL_BUSCA.Contains('@'))
                {
                    SQL_BUSCA += " AND ";
                }
                else
                {

                }
                SQL_BUSCA += "nome LIKE @nome";
                parametros.Add(new SqlParameter("@nome", "%" + cliente.Nome + "%"));
            }

            if (cliente.CpfCnpj != null && !cliente.CpfCnpj.Equals(""))
            {

                if (SQL_BUSCA.Contains('@'))
                {
                    SQL_BUSCA += " AND ";
                }
                else
                {

                }
                SQL_BUSCA += "cpf_cnpj = @cpfcnpj";
                parametros.Add(new SqlParameter("@cpfcnpj", cliente.CpfCnpj));
            }

            try
            {
                connection.Open();

                comandoExecutar = new SqlCommand(SQL_BUSCA, connection);

                foreach (var parametro in parametros)
                {
                    comandoExecutar.Parameters.Add(parametro);
                }

                resultadoBusca = comandoExecutar.ExecuteReader();

                while (resultadoBusca.Read())
                {
                    auxiliar = new Cliente();

                    auxiliar.Codigo = Int32.Parse(resultadoBusca["id_cliente"].ToString());
                    auxiliar.Nome = resultadoBusca["nome"].ToString();
                    auxiliar.CpfCnpj = resultadoBusca["cpf_cnpj"].ToString();

                    clientesRecuperados.Add(auxiliar);
                }

            }
            catch (Exception cause)
            {
                throw new Exception("A busca não trouxe nenhum resultado - causa: " + cause.Message);
            }
            finally
            {
                connection.Close();
            }

            return clientesRecuperados;
        }

        public List<Cliente> recuperarTodosClientes() 
        {
            List<Cliente> clientesCadastrados = new List<Cliente>();

            String SQL_CONSULTA = "SELECT id_cliente, nome FROM Cliente";
            SqlCommand comandoExecutar = null;
            SqlDataReader resultadosObtidos = null;
            Cliente auxiliar = null;

            try
            {
                connection.Open();

                comandoExecutar = new SqlCommand(SQL_CONSULTA, connection);

                resultadosObtidos = comandoExecutar.ExecuteReader();

                while(resultadosObtidos.Read())
                {
                    auxiliar = new Cliente();

                    auxiliar.Codigo = int.Parse(resultadosObtidos["id_cliente"].ToString());
                    auxiliar.Nome = resultadosObtidos["nome"].ToString();

                    clientesCadastrados.Add(auxiliar);
                }
            }
            catch (Exception)
            {
                throw new Exception("A busca de clientes não retornou resultados");
            }
            finally
            {
                connection.Close();
            }

            return clientesCadastrados;
        }
    }
}